//
// Created by Administrator on 2022/10/15.
//

#include <stdio.h>

#define MAXSIZE 1000
#define ERROR 0
#define OK 1
typedef int ElementType;
typedef int Status;
//定义一个静态数组
typedef struct {
    ElementType data;
    int cur;
}Component,StaticLinkList[MAXSIZE];
//StaticLinkList[MAXSIZE] 等价于component [MAXSIZE] StaticLinkList
//初始化一个静态链表
//静态链表的第一个节点为备用链表的头节点,后续存储着所有可以使用的节点
//静态链表的最后一个节点作为存储数据的链表的头节点,后续存储着已经使用数据的节点
Status initList(StaticLinkList space){
        //给每个cur游标赋初始值
    for (int i = 0; i < MAXSIZE - 1; ++i) {
        space[i].cur = i+1;
    }
    //给最后一个下标赋值为0
    space[MAXSIZE-1].cur =0;
    return OK;
}

//获取静态链表的长度
int ListLength(StaticLinkList space){
    int length=0;
    //k为第一个数据节点的下标
    int k = MAXSIZE-1;

    while(space[k].cur!=0){
        k = space[k].cur;
        length++;
    }
    return length;
}
//获取链表备用空间中的一个可用下标
int getCur(StaticLinkList space){
    int i =space[0].cur ;
    if(i){
        space[0].cur = space[i].cur;//返回一个空闲空间的下标,并将该空间设置为不可用
    }
//    if(i=1){
//        space[MAXSIZE-1].cur=1;
//    }
    return i;
}

//向静态链表中插入一个元素
Status insertList(StaticLinkList space,int i,ElementType e){
    if(i>MAXSIZE-1 ||i> ListLength(space)+1 ||i<0){
        return ERROR;
    }
    int k = MAXSIZE-1;//获得第一个元素的下标
    //获取一个备用空间的下标
    int c1 = getCur(space);
    if(c1){
        //将要存放的数据放进去
        space[c1].data = e;
        //获得要插入元素的前一个元素的下标
        for (int j = 0; j <i-1 ; ++j) {
            k = space[k].cur;
        }
        //让插入的元素指向后一个元素
        space[c1].cur = space[k].cur;
        //让前一个元素指向插入的元素
        space[k].cur = c1;
        return OK;
    }
    return ERROR;
}
void freeList(StaticLinkList space,int i ){
    //将i节点放入待回收节点,头插入备用空间的头节点
    space[i].cur = space[0].cur;
    space[0].cur = i;
}

//静态链表删除操作
Status delList(StaticLinkList space,int i ,ElementType* e){
    if(i> ListLength(space)||i<0){
        return ERROR;
    }
    int k = MAXSIZE-1;//第一个元素下标
    //定位到删除元素的前一个元素
    for (int j = 0; j < i-1; ++j) {
        k = space[k].cur;
    }
    int q = space[k].cur;//待删除元素的下标
    *e = space[q].data;
    space[k].cur = space[q].cur;
    freeList(space,q);
    return OK;
}
//显示静态链表中的所有元素
void showStaticLinkedList(StaticLinkList space){
    int k =MAXSIZE-1;//
    while(space[k].cur){
        k=space[k].cur;
        printf("%d\n",space[k].data);

    }
}
void main(){
    StaticLinkList list;
    initList(list);
    int status = 0;
    for (int i = 0; i < 10; ++i) {
        status =insertList(list,i+1,i);
    }
    ElementType e;
    delList(list,9,&e);
    showStaticLinkedList(list);
}
